package com.inepex.inechart.shared.data;


public abstract class KeyValueDataEntry<K extends Comparable<K>,V extends Number> extends AbstractDataEntry 
implements Comparable<KeyValueDataEntry<K,V>>
{
	
	protected K key;
	protected V value;
	
	protected KeyValueDataEntry() {
	}
	
	protected KeyValueDataEntry(K key, V value) {
		this.key = key;
		this.value = value;
	}
	
	public K getKey() {
		return key;
	}
	
	public void setKey(K key) {
		this.key = key;
	}
	
	public V getValue() {
		return value;
	}
	
	public void setValue(V value) {
		this.value = value;
	}

	public abstract double[] getValuePair();
	
	@SuppressWarnings("unchecked")
	public int getIndex(){
		if(container == null){
			return -1;
		}
		return ((KeyValueDataSet<KeyValueDataEntry<K, V>>) container).indexOf(this);
	}

	@Override
	public int hashCode() {
		final int prime = 31;
		int result = 1;
		result = prime * result + ((key == null) ? 0 : key.hashCode());
		result = prime * result + ((value == null) ? 0 : value.hashCode());
		return result;
	}

	@Override
	public boolean equals(Object obj) {
		if (this == obj)
			return true;
		if (obj == null)
			return false;
		if (getClass() != obj.getClass())
			return false;
		@SuppressWarnings("unchecked")
		KeyValueDataEntry<K, V> other = (KeyValueDataEntry<K, V>) obj;
		if (key == null) {
			if (other.key != null)
				return false;
		} else if (!key.equals(other.key))
			return false;
		if (value == null) {
			if (other.value != null)
				return false;
		} else if (!value.equals(other.value))
			return false;
		return true;
	}

	@Override
	public int compareTo(KeyValueDataEntry<K, V> o) {
		return key.compareTo(o.key);
	}
	
}
